Lighgt2D でTorchを作る
ligth 明かり
torch 松明
イギリス人は後者で呼ぶらしい
Light2Dの基本
Light2D は、Lightmap Textureが必要
Light2D の原点から計算される、Textureが存在するところではなく
Light2Dの光は、Occlusion(障害物)でブロックされる
自動で影を作る
Light と Occlusion は Layerを使う
Collision の Layer と Mask と同じ
Lightmapとは
照明効果を比較的低コストの計算で実現するため、StaticBody(壁、床、天井)については
計算した結果をテクスチャで最初から貼り付けておく。
↑は3Dの話で、2Dの場合はアルファが設定された白 ~ 黒で
光の強さ&範囲を表現したpng画像のこと
https://gyazo.com/b6a4bc271af1c51963da56c238d80f73
LightMapとLight2Dの位置関係
https://gyazo.com/9d3d32c3560b59f1bad5db4328d9f35a
https://gyazo.com/ffa90ede9acd13f39e6efe85f9aaae42
前者も後者も、右に放射状になっているライトマップを使っている。
ただし、light2Dの原点からの位置が違うので、異なる照明効果になる。
Torch を作る
ブランチをシーンで分けておく
1. Add > Light2D
2. 名前を"Torch"にする
3. インスペクタ > Texture > lightmap.png を追加
白黒、透明背景
4. offsetをあわせる
オレンジの枠でテクスチャの範囲が表示される
Playerの目の前あたり
ちなみに、背景にTileMap, Spriteがないと、この光は表示されない。
AutoTile に Occlusion を追加
Occlusionは、 Collision の Light2Dが発する光に対するバージョン。
閉塞、遮断、妨害
1. TileMap > TileSet リソースを選択
2. 下のタブを最大化
3. Walls セットをクリックして選択
4. Occlusionボタンを押す
5. Collision と同じ要領で、Rectangle や Polygonを設定する
Light2D.Shadow のプロパティ
.enabled
これをonにしていないと、Occlusionによる光の遮断が起きない。
使うときはonにしておく
使わないときはoffのほうが、リソース効率がいい(デフォルトはoff)
CanvasModulate : Level全体を暗くする
CanvasModulate自体は、Node2Dの派生オブジェクト
実は、Node2DはControleと同様に、CanvasItemの1つに属する
CanvasLayer
CanvasItem
Controle
Node2D
ともかく、CanvasModuleがSceneツリーに入っているだけで、
シーン全体のCanvasの色味を調整できる。
グレーな感じにしておく。
赤い感じにして、熱源のあるエリアを表現したりもできそう.,
LightOccluder2D : 普通のSpriteに影をつける
Occluderは、普通のSpriteにも付けれる
CollisionShape2Dと同じような感じ
Character.tscnに追加する。
そのままだと、Occluderの形状がないという警告がでるので、
インスペクタからOccluderを作成、ポリゴンエディタで形状を作る。
https://gyazo.com/9b26f6142edfde638791c44b248cb01d
※注意 : Light2D がPlayerの中に入っていると、光が遮断されて出てこないので、正面あたりに出しておく。
https://gyazo.com/f9668c52340227c5330606f6b03510db
これで、普通のSpriteにも影を付けられた
Cull Mode
Cull = 選り抜く、抜粋する、選択
Occluerリソースのモード
Disabled : Occluderの中身は光が当たらない
ClockWise : 中に光が当たる
CounterClockWise : ?
ここではClockWiseにしておく
ライトのトグル
InputMap に、torch_toggleをセット、SPACEキーを割り当て
code: Torch.py
func toggle_torch():
if Input.is_action_just_pressed("torch_toggle"):
$Torch.enabled = !$Torch.enabled
まとめ
Light2D
透明背景に白黒画像のLightMapを設定する
LightMapとLight2D Node の位置により、照明効果が変わるので注意
Light2D.Shadow.enabled しないと、Occluderによる遮蔽、影の生成がされない
リソース効率
後ろにSpriteなどのテクスチャがないと、光の効果は見られない
Occluder2D
AutoTile > Occlusion で、タイルマップでの光の遮蔽
普通に、Spriteに設定することもできる
Cull Modeで、中に光が当たるかどうかを決める